package lainey.ui.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class BigDecimalUtil {

    // 实际上这是BigDecimal将double转化为BigDecimal时出的问题，这是因为0.21不能够精确的表示double值，
    // 使用BigDecimal将double转化为精确值的时候所得的结果就会是0.2099999999999999922284388276239042170345783233642578125，
    // 所以相乘以后结果会是那个样子。
    // 将String转为BigDecimal的时候，字符串是多少，结果就是多少，因此想要将double类型的数据转为BigDecimal的时候，
    // 这样做也许才是你想要的结果：

    /**
     * 提供精确乘法运算的mul方法
     */
    public static BigDecimal mulByBigDecimal(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2);
    }

    /**
     * 提供精确乘法运算的mul方法
     */
    public static double mul(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 使用精准计算模式计算浮点数减法
     */
    public static long subtract(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).longValue();
    }

    /**
     * 提供精确加法计算的add方法
     */
    public static BigDecimal add(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2);
    }

    /**
     * 提供精确的除法运算方法div
     */
    public static double div(String v1, String v2, int scale) throws IllegalAccessException {
        // 如果精确范围小于0，抛出异常信息
        if (scale < 0) {
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.divide(b2, scale).doubleValue();
    }

    /**
     * 保留2位小数
     */
    public static String retain2Dot(double value) {
        DecimalFormat decimalFormat = new DecimalFormat("#0.00");
        return decimalFormat.format(value);
    }


}
